#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/timerfd.h>

int main()
{
    // 1. 创建定时器
    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);// 阻塞式
    if(timerfd < 0)
    {
        std::cerr << "timerfd create fail" << std::endl;
        exit(-1);
    }
    // 2. 设置超时时间，启动定时器
    struct itimerspec timerspec;
    // 设置第一次超时时间
    timerspec.it_value.tv_sec = 3;// 3s
    timerspec.it_value.tv_nsec = 0;
    // 设置第一次超时后的超时时间
    timerspec.it_interval.tv_sec = 1;
    timerspec.it_interval.tv_nsec = 0;
    timerfd_settime(timerfd, 0, &timerspec, nullptr);

    // 提取超时时间/次数
    while(true)
    {
        uint64_t times;// 超时次数
        int ret = read(timerfd, &times, 8);// timerfd是阻塞式读取，没有数据就阻塞
        if(ret < 0)
        {
            std::cerr << "read times fail" << std::endl;
            exit(-1);
        }
        printf("已超时，距离上一次，超时了%ld次\n", times);
    }

    // 3. 关闭定时器
    close(timerfd);

    return 0;
}